// Copyright (C) 1953-2022 NUDT
// Verilog module name - lookup_table_sort
// Version: V4.1.0.20221210
// Created:
//         by - fenglin 
////////////////////////////////////////////////////////////////////////////
// Description:
//
///////////////////////////////////////////////////////////////////////////

`timescale 1ns/1ps

module lookup_table_sort
(
        i_clk,
        i_rst_n,
       
        iv_hcp_mid                   ,
       
        i_tsmp_lookup_table_key_wr       ,
        iv_tsmp_lookup_table_key         ,
        ov_tsmp_lookup_table_outport     ,
        o_tsmp_lookup_table_outport_wr   ,

        ov_ram_raddr_notlocal    ,
        o_ram_rd_notlocal        ,
        iv_ram_rdata_notlocal	 ,
        
        ov_ram_raddr_local       ,
        o_ram_rd_local           ,
        iv_ram_rdata_local       
);

// I/O
// clk & rst
input                     i_clk;                   //125Mhz
input                     i_rst_n;

input         [11:0]      iv_hcp_mid;

input                     i_tsmp_lookup_table_key_wr       ;
input         [47:0]      iv_tsmp_lookup_table_key         ;
output reg    [32:0]      ov_tsmp_lookup_table_outport     ;
output reg                o_tsmp_lookup_table_outport_wr   ;

output reg    [11:0]      ov_ram_raddr_notlocal;
output reg                o_ram_rd_notlocal    ;
input         [33:0]      iv_ram_rdata_notlocal;

output reg    [11:0]      ov_ram_raddr_local;
output reg                o_ram_rd_local    ;
input         [33:0]      iv_ram_rdata_local;

reg                       r_local_flag;
reg           [3:0]       rv_lts_state;
localparam            INIT_S                = 4'd0,
                      IDLE_S                = 4'd1,
                      WAIT_FIRST_S          = 4'd2,
                      WAIT_SECOND_S         = 4'd3,
                      GTE_DATA_S            = 4'd4;
                      
always @(posedge i_clk or negedge i_rst_n) begin
    if(i_rst_n == 1'b0)begin
        ov_tsmp_lookup_table_outport       <= 33'h0;
        o_tsmp_lookup_table_outport_wr     <= 1'h0;	
        
        ov_ram_raddr_notlocal        <= 12'h0;
        o_ram_rd_notlocal            <= 1'h0;
        
        ov_ram_raddr_local           <= 12'h0;
        o_ram_rd_local               <= 1'h0;
        
        r_local_flag                 <= 1'b0;
        rv_lts_state                 <= INIT_S;
    end                        
    else begin
	    case(rv_lts_state)
            INIT_S:begin
                if(i_tsmp_lookup_table_key_wr)begin
                    ov_tsmp_lookup_table_outport     <= {1'b1,32'b0};
                    o_tsmp_lookup_table_outport_wr   <= 1'b1; 
                    
                    ov_ram_raddr_notlocal            <= 12'h0;
                    o_ram_rd_notlocal                <= 1'h0;
                                                     
                    ov_ram_raddr_local               <= 12'h0;
                    o_ram_rd_local                   <= 1'h0;
                    
                    r_local_flag                     <= 1'b1;
                    rv_lts_state                     <= IDLE_S;
                end
                else begin
                    ov_tsmp_lookup_table_outport    <= 33'h0;
                    o_tsmp_lookup_table_outport_wr  <= 1'h0;
                    ov_ram_raddr_notlocal           <= 12'h0;
                    o_ram_rd_notlocal               <= 1'h0;
                                                    
                    ov_ram_raddr_local              <= 12'h0;
                    o_ram_rd_local                  <= 1'h0;
                    
                    r_local_flag                    <= 1'b0;
                    rv_lts_state                    <= INIT_S;
                end	                
			end
            IDLE_S:begin
                if(i_tsmp_lookup_table_key_wr)begin
                    ov_tsmp_lookup_table_outport     <= 33'h0;
                    o_tsmp_lookup_table_outport_wr   <= 1'h0;
                    rv_lts_state                     <= WAIT_FIRST_S;                    
                    if(iv_hcp_mid==iv_tsmp_lookup_table_key[23:12])begin
                        ov_ram_raddr_notlocal            <= 12'h0;
                        o_ram_rd_notlocal                <= 1'h0;
                                                         
                        ov_ram_raddr_local               <= iv_tsmp_lookup_table_key[11:0];
                        o_ram_rd_local                   <= 1'h1;
                        
                        r_local_flag                     <= 1'b1;
                    end
                    else begin                                                                    
                        ov_ram_raddr_notlocal            <= iv_tsmp_lookup_table_key[23:12];
                        o_ram_rd_notlocal                <= 1'h1;
                                                         
                        ov_ram_raddr_local               <= 12'h0;
                        o_ram_rd_local                   <= 1'h0;

                        r_local_flag                     <= 1'b0;                      
                    end                        
                end
                else begin
                    ov_tsmp_lookup_table_outport    <= 33'h0;
                    o_tsmp_lookup_table_outport_wr  <= 1'h0;
                    ov_ram_raddr_notlocal           <= 12'h0;
                    o_ram_rd_notlocal               <= 1'h0;
                                                    
                    ov_ram_raddr_local              <= 12'h0;
                    o_ram_rd_local                  <= 1'h0;
                    
                    r_local_flag                    <= 1'b0;
                    rv_lts_state                    <= IDLE_S;
                end	                
			end
			WAIT_FIRST_S:begin
                ov_ram_raddr_notlocal            <= 12'h0;
                o_ram_rd_notlocal                <= 1'h0;
                                                 
                ov_ram_raddr_local               <= 12'h0;
                o_ram_rd_local                   <= 1'h0;
                if(r_local_flag)begin
                    rv_lts_state                     <= GTE_DATA_S;
                end
                else begin
                    rv_lts_state                     <= WAIT_SECOND_S;
                end			
			end
			WAIT_SECOND_S:begin
                ov_ram_raddr_notlocal            <= 12'h0;
                o_ram_rd_notlocal                <= 1'h0;
                                                 
                ov_ram_raddr_local               <= 12'h0;
                o_ram_rd_local                   <= 1'h0;
				rv_lts_state                     <= GTE_DATA_S;			
			end		
			GTE_DATA_S:begin
                ov_ram_raddr_notlocal           <= 12'h0;
                o_ram_rd_notlocal               <= 1'h0;
                                                
                ov_ram_raddr_local              <= 12'h0;
                o_ram_rd_local                  <= 1'h0;            
                if(r_local_flag)begin
                    ov_tsmp_lookup_table_outport       <= iv_ram_rdata_local[32:0];
                    o_tsmp_lookup_table_outport_wr     <= 1'b1;                
                end
                else begin
                    ov_tsmp_lookup_table_outport       <= iv_ram_rdata_notlocal[32:0];
                    o_tsmp_lookup_table_outport_wr     <= 1'b1;                   
                end
                rv_lts_state                       <= IDLE_S;              
			end
            default:begin
                ov_tsmp_lookup_table_outport       <= 33'h0;
                o_tsmp_lookup_table_outport_wr     <= 1'h0;	
                
                ov_ram_raddr_notlocal        <= 12'h0;
                o_ram_rd_notlocal            <= 1'h0;
                
                ov_ram_raddr_local           <= 12'h0;
                o_ram_rd_local               <= 1'h0;
                
                r_local_flag                 <= 1'b0;
				rv_lts_state                 <= IDLE_S;
            end
        endcase
    end
end	
endmodule